#include "main.h"
#include "24l01.h"
/******************************************************************************
 * @file    nRF24L01
 * @brief   ���ļ���Ҫ����24l01ģ�鳣������������������д�Ĵ������л����ͽ���ģʽ�ȹ��ܡ��ļ�������д���������������á�
 *          - �ù��̴�����Ŀ����Ϊ�˸�XJRC����һ���ʵ�õ����ߴ���ģ�塣
 * @version V1.0.0
 * @date    �������ڣ�2025-10-22
 * 
 * @detail  ��ϸ������
 *          - �ļ�������ϸ˵����������д�Ĵ�����������дbuff���������շ��Ͳ������л����շ���ģʽ������
 *          - ��Ҫ���ԣ��ⲿ�ӿں���ֻ��Ҫ����NRF24L01_RX_Mode()��NRF24L01_TX_Mode(),NRF24L01_RxPacket��NRF24L01_TxPacket���ĸ��������ɡ�
 *          - ʹ��ע�������Ҫ������Ϣǰһ��Ҫ���л�������ģʽ������ʱ�л��ɽ���ģʽ��
 * 
 * @author  Ф���� ���Ȅ1�7 ����ￄ1�7
 * @email   
 * 
 * @note    �ر�˵����
 *          - Ŀǰ�汾����ԭʼ��ֻ�ǳ���ʵ�������ߴ��ڵĹ��ܣ���100HzƵ��˫���շ���Ϣ�ɻ���ʵ�ֲ�������
 *						Ŀǰ�Դ��ڵ�������������շ�ʱ��Ϣ����ճ������while�������Ϣ������̫�����ȵￄ1�7
 * 
 * 
 * @history �޸���ʷ��
 *          <�汾��>    <����>        	<�޸���>    					<�޸�����>
 *          V1.0.0     2025-10-22    	���Ȼ�������        ��ʼ�汾
 *    
 ******************************************************************************/

//���õ�һ���µ�nRF24L01ģ��ʱ����Խ���Ҫ�����һ���ֽڣ�һ�Ե����뷢Ӧ�öԳ�
const uint8_t TX_ADDRESS[TX_ADR_WIDTH]={0x12,0x34,0x56,0x78,0x22}; //���͵�ַ
const uint8_t RX_ADDRESS[RX_ADR_WIDTH]={0x12,0x34,0x56,0x78,0x11}; //���յ�ַ

extern SPI_HandleTypeDef hspi1;
volatile uint8_t see;


//SPI1 ��дһ���ֽ�
//TxData:Ҫд����ֽￄ1�7
//����ֵ:��ȡ�����ֽ�
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{
	uint8_t Rxdata;
  HAL_SPI_TransmitReceive(&hspi1,&TxData,&Rxdata,1, 1000);       
 	return Rxdata;          		    //�����յ�������		
}

//��ￄ1�724L01�Ƿ���ￄ1�7
//����ֵ:0���ɹ�;1��ʧ��	
uint8_t NRF24L01_Check(void)
{
	uint8_t buf[5]={0X55,0X55,0X55,0X55,0X55};
	uint8_t i;
   	 
	NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//д��5���ֽڵĵ�ַ.	
	NRF24L01_Read_Buf(TX_ADDR,buf,5); //����д��ĵ�ք1�7  
	for(i=0;i<5;i++){
		if(buf[i]!=0X55)
			break;
	}
	if(i!=5)
		return 1;//��ￄ1�724L01����	
	return 0;		 //��ⵄ1�724L01
}	 	 
//SPIд�Ĵ���
//reg:ָ���Ĵ�����ַ
//value:д���ք1�7
uint8_t NRF24L01_Write_Reg(uint8_t reg,uint8_t value)
{
	uint8_t status;	
	NRF24L01_CSN_0;                 //ʹ��SPI����
	status =SPI1_ReadWriteByte(reg);//���ͼĴ����� 
	SPI1_ReadWriteByte(value);      //д��Ĵ�����ք1�7
	NRF24L01_CSN_1;                 //��ֹSPI����	   
	return(status);       		    //����״ֵ̬
}
//��ȡSPI�Ĵ���ֵ
//reg:Ҫ���ļĴ���
uint8_t NRF24L01_Read_Reg(uint8_t reg)
{
	uint8_t reg_val;	    
	NRF24L01_CSN_0;             //ʹ��SPI����		
	SPI1_ReadWriteByte(reg);    //���ͼĴ�����
	reg_val=SPI1_ReadWriteByte(0XFF);//��ȡ�Ĵ�������
	NRF24L01_CSN_1;             //��ֹSPI����		    
	return(reg_val);            //����״ֵ̬
}	
//��ָ��λ�ö���ָ�����ȵ�����
//reg:�Ĵ���(λ��)
//*pBuf:����ָ��
//len:���ݳ���
//����ֵ,�˴ζ�����״̬�Ĵ���ֵ 
uint8_t NRF24L01_Read_Buf(uint8_t reg,uint8_t *pBuf,uint8_t len)
{
	uint8_t status,u8_ctr;	       
  NRF24L01_CSN_0;            //ʹ��SPI����
  status=SPI1_ReadWriteByte(reg);//���ͼĴ���ֵ(λ��),����ȡ״ֵ̬   	   
	for(u8_ctr=0;u8_ctr<len;u8_ctr++)
		pBuf[u8_ctr]=SPI1_ReadWriteByte(0XFF);//��������
  NRF24L01_CSN_1;            //�ر�SPI����
  return status;             //���ض�����״ֵ̬
}
//��ָ��λ��дָ�����ȵ�����
//reg:�Ĵ���(λ��)
//*pBuf:����ָ��
//len:���ݳ���
//����ֵ,�˴ζ�����״̬�Ĵ���ֵ
uint8_t NRF24L01_Write_Buf(uint8_t reg, uint8_t *pBuf, uint8_t len)
{
	uint8_t status,u8_ctr;	    
	NRF24L01_CSN_0;             //ʹ��SPI����
	status = SPI1_ReadWriteByte(reg);//���ͼĴ���ֵ(λ��),����ȡ״ֵ̬
  for(u8_ctr=0; u8_ctr<len; u8_ctr++)
		SPI1_ReadWriteByte(*pBuf++); //д������	 
  NRF24L01_CSN_1;             //�ر�SPI����
  return status;              //���ض�����״ֵ̬
}				   
//����NRF24L01����һ������
//txbuf:�����������׵�ַ
//����ֵ:�������״�ￄ1�7
uint8_t NRF24L01_TxPacket(uint8_t *txbuf, uint8_t tx_len)
{
	uint8_t sta;
	NRF24L01_CE_0;
  NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,tx_len);//д���ݵ�TX BUF  tx_len���ֽ�
 	NRF24L01_CE_1;                          //��������	   
	while(NRF24L01_IRQ != GPIO_PIN_RESET);  //�ȴ�������ￄ1�7
	sta=NRF24L01_Read_Reg(STATUS);          //��ȡ״̬�Ĵ�����ֵ	   
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //���TX_DS��MAX_RT�жϱ�־
	if(sta&MAX_TX)                          //�ﵽ����ط����ￄ1�7
	{
		NRF24L01_Write_Reg(FLUSH_TX,0xff);  	//���TX FIFO�Ĵ��� 
		return MAX_TX; 
	}
	if(sta & TX_OK)                           //������ￄ1�7
	{
		NRF24L01_Write_Reg(FLUSH_TX,0xff);  	//���TX FIFO�Ĵ��� 
		return TX_OK;
	}
	return 0xff;//����ԭ����ʧ��
}

uint8_t NRF24L01_RxPacket(uint8_t *rxbuf)
{
	uint8_t sta;
	sta=NRF24L01_Read_Reg(STATUS);         							//��ȡ״̬�Ĵ�����ֵ    	 
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); 			//���TX_DS��MAX_RT�жϱ�־
	if(sta & RX_OK)//���յ�����
	{
		uint8_t rx_len = NRF24L01_Read_Reg(R_RX_PL_WID);	//��ȡ���ݳ���
		see=rx_len;
		NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,rx_len);			//��ȡ����
		NRF24L01_Write_Reg(FLUSH_RX,0xff); 								//���RX FIFO�Ĵ��� 
		return 0; 
	}	   
	return 1;//û�յ��κ�����
}					    
//�ú�����ʼ��NRF24L01��RXģʽ
//����RX��ַ,дRX���ݿ���,ѡ��RFƵ��,�����ʺ�LNA HCURR
//��CE��ߺￄ1�7,������RXģʽ,�����Խ���������		   
void NRF24L01_RX_Mode(void)
{
	NRF24L01_CE_0;	  
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P1,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH);//дRX�ڵ��ք1�7
	
	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x00);       //�ر��Զ�Ӧ��    
	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x02);   //ʹ��ͨ��1�Ľ��յ�ַ
	NRF24L01_Write_Reg(NRF_WRITE_REG+DYNPD, 0x02);			//ʹ�ܶ�̬����1
	NRF24L01_Write_Reg(NRF_WRITE_REG+FEATURE, 0x04);		//ʹ�ܶ�̬����
	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);	        //����RFͨ��Ƶ��		  
	NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P1,RX_PLOAD_WIDTH);//ѡ��ͨ��1����Ч���ݿ��� 	    
	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);    //����TX������ￄ1�7,0db����,2Mbps,���������濪��   
	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);     //���û�������ģʽ�Ĳ���;PWR_UP,EN_CRC,16BIT_CRC,����ģʽ 
	NRF24L01_Write_Reg(FLUSH_RX,0xff);  //���RX FIFO�Ĵ��� 
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff);  //���STATUS�Ĵ��� 
	NRF24L01_CE_1; //CEΪ��,�������ģʄ1�7 
}						 
//�ú�����ʼ��NRF24L01��TXģʽ
//����TX��ַ,дTX���ݿ���,����RX�Զ�Ӧ��ĵ�ք1�7,���TX��������,ѡ��RFƵ��,�����ʺ�LNA HCURR
//PWR_UP,CRCʹ��
//��CE��ߺￄ1�7,������RXģʽ,�����Խ���������		   
//CEΪ�ߴ���10us,����������.	 
void NRF24L01_TX_Mode(void)
{														 
	NRF24L01_CE_0;	    
	NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(uint8_t*)TX_ADDRESS,TX_ADR_WIDTH);//дTX�ڵ��ք1�7 
	NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(uint8_t*)RX_ADDRESS,RX_ADR_WIDTH); //����TX�ڵ��ք1�7,��ҪΪ��ʹ��ACK	  

	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x00);     //ʹ��ͨ��0���Զ�Ӧ��    
	NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //ʹ��ͨ��0�Ľ��յ�ַ  
	NRF24L01_Write_Reg(NRF_WRITE_REG+DYNPD, 0x01);		//ʹ�ܶ�̬����0
	NRF24L01_Write_Reg(NRF_WRITE_REG+FEATURE, 0x04);	//ʹ�ܶ�̬����
	NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x00);//�ر��Զ��ط�
	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40);       //����RFͨ��Ϊ40
	NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);  //����TX������ￄ1�7,0db����,2Mbps,���������濪��   
	NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e);    //���û�������ģʽ�Ĳ���;PWR_UP,EN_CRC,16BIT_CRC,����ģʽ,���������ж�
	NRF24L01_Write_Reg(FLUSH_TX,0xff);  //���TX FIFO�Ĵ��� 
	NRF24L01_Write_Reg(FLUSH_RX,0xff);  //���RX FIFO�Ĵ��� 
	NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,0xff);  //���STATUS�Ĵ��� 
	NRF24L01_CE_1;//CEΪ��,10us����������
}


